package com.yawn.spock.util

/**
 * 测试用例的设计：路径覆盖原则
 * @author yawn http://jvm123.com
 *     2019/10/15 14:19
 */
class MyMath {

    /**
     * <pre>
     * 等价类：
     *   单输入的被测试模块，根据路径覆盖原则，将测试用例分为两个等价类(-∞, 0)和[0, +∞)，
     *   从每一个等价类中取一个测试用例即可。
     * 所以取-1和1即可满足。
     * 边界值：
     *   如果对0还不放心，则可以取第三个测试用例0进行测试。
     * </pre>
     */
    static int abs(int num) {
        int abs
        if (num < 0) {
            abs = -num
        } else {
            abs = num
        }
        abs
    }

    /**
     * <pre>
     * 多输入的被测试模块
     * 如下：
     *   三个输入，每个输入有两个等价类，所以取三个输入参数的全排列，一共需要2*2*2=8个测试用例。(全面测试)
     *   在满足路径覆盖的基础上，我们为了减少测试的次数，可以通过正交排列和正交表选取具有代表性的测试用例。
     * 选取结果：
     *  (-1, -1,  -1)
     *  (-1, 11, 111)
     *  ( 1, -1, 111)
     *  ( 1, 11,  -1)
     * </pre>
     */
    static int mySum(int a, int b, int c) {

        int aa, bb, cc

        if (a < 0) {
            aa = 0
        } else {
            aa = 1
        }

        if (b < 10) {
            bb = 0
        } else {
            bb = 1
        }

        if (c < 100) {
            cc = 0
        } else {
            cc = 1
        }

        aa + bb + cc
    }

    /*
     * 在实际项目中，等价类的划分，可以是具有某同一属性的对象。
     * 例如，某个程序模块是根据用户的类型计算商品邮费，需要输入用户对象：
     *   因此我们可以将用户按照类型分为这几个等价类：普通用户、vip用户、访客用户，
     *   再分别从这三个等价类中选取一个测试用例即可。
     *
     */
}
